package com.sourceQ.system.service.tenant;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sourceQ.system.domain.tenant.Tenant;
import com.sourceQ.system.dto.tenant.TenantPageReqDTO;
import com.sourceQ.system.dto.tenant.TenantSaveReqDTO;
import com.sourceQ.system.vo.tenant.TenantVo;
import com.sourceQ.system.service.handler.TenantInfoHandler;
import com.sourceQ.system.service.handler.TenantMenuHandler;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author: SourceQ
 * @create: 2024-03-26 10:30
 * @Description:
 */
public interface TenantService extends IService<Tenant> {

    /**
     * 创建租户
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Map<String, String> createTenant(@Valid TenantSaveReqDTO createReqVO);

    /**
     * 更新租户
     *
     * @param updateReqVO 更新信息
     */
    void updateTenant(@Valid TenantSaveReqDTO updateReqVO);

    /**
     * 更新租户的用户的角色
     *
     * @param tenantId 租户编号
     * @param roleIds 角色编号数组
     */
    void updateTenantUserRole(Long tenantId, Set<Long> roleIds);

    /**
     * 删除租户
     *
     * @param ids 编号
     */
    void deleteTenant(Long[] ids);

    /**
     * 获得租户
     *
     * @param id 编号
     * @return 租户
     */
    TenantVo getTenant(Long id);

    /**
     * 获得租户分页
     *
     * @param pageReqVO 分页查询
     * @return 租户分页
     */
    IPage<TenantVo> getTenantPage(Page page,TenantPageReqDTO pageReqVO);

    /**
     * 获得名字对应的租户
     *
     * @param name 租户名
     * @return 租户
     */
    Tenant getTenantByName(String name);


    /**
     * 获得使用指定套餐的租户数量
     *
     * @param packageId 租户套餐编号
     * @return 租户数量
     */
    Long getTenantCountByPackageId(Long packageId);

    /**
     * 获得使用指定套餐的租户数组
     *
     * @param packageId 租户套餐编号
     * @return 租户数组
     */
    List<Tenant> getTenantListByPackageId(Long packageId);

    /**
     * 进行租户的信息处理逻辑
     * 其中，租户编号从 {@link TenantContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleTenantInfo(TenantInfoHandler handler);

    /**
     * 进行租户的菜单处理逻辑
     * 其中，租户编号从 {@link TenantContextHolder} 上下文中获取
     *
     * @param handler 处理器
     */
    void handleTenantMenu(TenantMenuHandler handler);

    /**
     * 获得所有租户
     *
     * @return 租户编号数组
     */
    List<Long> getTenantIdList();

    /**
     * 校验租户是否合法
     *
     * @param id 租户编号
     */
    void validTenant(Long id);

    /**
     * 修改租户状态
     * @param id
     * @param status
     */
    void changeStatus(Long id,String status);
}
